package com.xteam.xnetworkdisk.utils;

//import com.google.common.collect.HashMultimap;
//import com.google.common.collect.Multimap;
import com.xteam.xnetworkdisk.constant.Constant;
import com.xteam.xnetworkdisk.utilsinterface.FileUtils;
//import io.minio.*;
//import io.minio.errors.MinioException;
//import io.minio.http.Method;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

//@Slf4j
//@Component
public class MinioUtilsNew /*implements FileUtils*/ {

//    @Autowired
//    private MinioClient client;

//    @Value("${minio.endpoint}")
//    private String endpoint;
//    @Autowired
//    private MinioClient minioClient;

    /**
     * 创建存储桶
     *
     * @param bucketName 存储桶名称
     */
//    @SneakyThrows
//    public void createBucket(String bucketName) {
//        try {
//            boolean exists = client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
//            if (!exists) {
//                client.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
//            }
//        } catch (MinioException e) {
//            log.error("创建存储桶失败：{}", e.getMessage(), e);
//            throw new RuntimeException("创建存储桶失败：" + e.getMessage(), e);
//        }
//    }

    /**
     * 复制文件
     *
     * @param bucketName 存储桶名称
     * @param oldFileName 原文件名
     * @return 新文件的路径
     */
//    @Override
//    public String copyFile(String bucketName, String oldFileName) {
//        try {
//            createBucket(bucketName);
//
//            String newFileName = System.currentTimeMillis() + oldFileName.substring(oldFileName.lastIndexOf("."));
//            client.copyObject(CopyObjectArgs.builder()
//                    .bucket(bucketName)
//                    .object(newFileName)
//                    .source(CopySource.builder()
//                            .bucket(bucketName)
//                            .object(oldFileName)
//                            .build())
//                    .build());
//
//            String path = endpoint + "/" + bucketName + "/" + newFileName;
//
//            if (client.statObject(StatObjectArgs.builder().bucket(bucketName).object(oldFileName + Constant.VIDEO_SUFFIX).build()) != null) {
//                newFileName += Constant.VIDEO_SUFFIX;
//                client.copyObject(CopyObjectArgs.builder()
//                        .bucket(bucketName)
//                        .object(newFileName)
//                        .source(CopySource.builder()
//                                .bucket(bucketName)
//                                .object(oldFileName)
//                                .build())
//                        .build());
//            }
//
//            return path;
//        } catch (MinioException e) {
//            log.error("复制文件失败：{}", e.getMessage(), e);
//            return null;
//        } catch (Exception e) {
//            log.error("复制文件时发生异常：{}", e.getMessage(), e);
//            return null;
//        }
//    }
//
//    /**
//     * 上传文件
//     *
//     * @param file 文件
//     * @param bucketName 存储桶
//     * @return 上传后的文件名
//     */
//    @Override
//    public String uploadFile(MultipartFile file, String bucketName,String suffix) {
//        try {
//            createBucket(bucketName);
//
//            String fileName = System.currentTimeMillis() + suffix;
//
//            client.putObject(PutObjectArgs.builder()
//                    .bucket(bucketName)
//                    .object(fileName)
//                    .stream(file.getInputStream(), file.getSize(), -1)
//                    .contentType(file.getContentType())
//                    .build());
//
//            return fileName;
//        } catch (Exception e) {
//            log.error("上传文件失败：{}", e.getMessage(), e);
//            throw new RuntimeException("文件上传失败：" + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 上传文件
//     *
//     * @param file 文件
//     * @param bucketName 存储桶
//     * @return 上传后的文件名
//     */
//    @Override
//    public String uploadFile(InputStream file, String bucketName,String suffix,Long fileSize,String contentType) {
//        try {
//            createBucket(bucketName);
//
//            String fileName = System.currentTimeMillis() + suffix;
//
//            client.putObject(PutObjectArgs.builder()
//                    .bucket(bucketName)
//                    .object(fileName)
//                    .stream(file, fileSize, -1)
//                    .contentType(contentType)
//                    .build());
//
//            return fileName;
//        } catch (Exception e) {
//            log.error("上传文件失败：{}", e.getMessage(), e);
//            throw new RuntimeException("文件上传失败：" + e.getMessage(), e);
//        }
//    }
//
//
//    /**
//     * 根据完整路径删除文件
//     *
//     * @param fullPath 文件的完整路径
//     * @return 删除操作是否成功
//     */
//    @Override
//    public boolean deleteFile(String fullPath) {
//        if (fullPath == null || fullPath.trim().isEmpty()) {
//            return false;
//        }
//
//        try {
//            String[] strings = parseBucketAndFilename(fullPath);
//            if (strings == null || strings.length != 2) {
//                return false;
//            }
//
//            String bucketName = strings[0];
//            String fileName = strings[1];
//
//            client.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
//            return true;
//        } catch (Exception e) {
//            log.error("删除文件时发生异常：{}", e.getMessage(), e);
//            return false;
//        }
//    }
//
//    /**
//     * 根据完整路径解析出存储桶名称和文件名
//     *
//     * @param fullPath 完整路径
//     * @return 包含存储桶名称和文件名的数组
//     */
//    @Override
//    public String[] parseBucketAndFilename(String fullPath) {
//        String path = fullPath.replaceAll("^[a-zA-Z]+://[^/]+/", "");
//        String[] parts = path.split("/", 2);
//
//        String bucketName = parts[0];
//        String filename = (parts.length > 1) ? parts[1] : "";
//
//        return new String[]{bucketName, filename};
//    }
//
//    /**
//     * 上传文件（使用输入流）
//     *
//     * @param inputStream 输入流
//     * @param bucketName 存储桶名称
//     * @param fileName 文件名
//     * @param contentType 文件内容类型
//     * @return 文件的路径
//     * @throws Exception
//     */
//    @Override
//    public String uploadFile(InputStream inputStream, String bucketName, String fileName, String contentType) throws Exception {
//        if (inputStream == null || bucketName == null || fileName == null || contentType == null) {
//            throw new IllegalArgumentException("参数不能为空");
//        }
//
//        try {
//            createBucket(bucketName);
//            client.putObject(PutObjectArgs.builder()
//                    .bucket(bucketName)
//                    .object(fileName)
//                    .stream(inputStream, -1, -1)
//                    .contentType(contentType)
//                    .build());
//
//            return endpoint + "/" + bucketName + "/" + fileName;
//        } catch (Exception e) {
//            log.error("上传文件失败：{}", e.getMessage(), e);
//            throw e;
//        }
//    }
//
//    /**
//     * 生成预签名 URL
//     *
//     * @param fullPath 文件的完整路径
//     * @param filenameR 文件名
//     * @return 预签名 URL
//     * @throws Exception
//     */
//    @SneakyThrows
//    @Override
//    public String generatePresignedUrl(String fullPath, String filenameR) {
//        String[] strings = parseBucketAndFilename(fullPath);
//        String bucketName = strings[0];
//        String fileName = strings[1];
//
//        try {
//            // 使用 MinioClient 生成预签名 URL
//            GetPresignedObjectUrlArgs.Builder urlArgsBuilder = GetPresignedObjectUrlArgs.builder()
//                    .method(Method.GET) // HTTP 方法
//                    .bucket(bucketName)
//                    .object(fileName)
//                    .expiry(Constant.LINK_VALIDITY_TIME); // 设置 URL 的有效期，例如 15 分钟
//
////            // 生成预签名 URL
////            String url = client.getPresignedObjectUrl(urlArgsBuilder.build());
//
//            // 如果提供了文件名，则设置 response-content-disposition 头
//            if (filenameR != null && !filenameR.isEmpty()) {
//                String encodedFilename = URLEncoder.encode(filenameR, StandardCharsets.UTF_8.toString());
//                Multimap<String, String> extraQueryParams = HashMultimap.create();
//                extraQueryParams.put("response-content-disposition", "attachment; filename=\"" + encodedFilename + "\"");
//                urlArgsBuilder.extraQueryParams(extraQueryParams);
//            }
//
//            // 生成预签名 URL
//            String url = client.getPresignedObjectUrl(urlArgsBuilder.build());
////            // 如果提供了文件名，则手动修改 URL 以包含响应内容处置
////            if (filenameR != null && !filenameR.isEmpty()) {
////                String encodedFilename = URLEncoder.encode(filenameR, StandardCharsets.UTF_8.toString());
////                url = url + "&response-content-disposition=attachment;filename=\"" + encodedFilename + "\"";
////            }
//
//            return url;
//        } catch (MinioException e) {
//            log.error("生成预签名 URL 时发生错误：{}", e.getMessage(), e);
//            throw new RuntimeException("生成预签名 URL 时发生错误：" + e.getMessage(), e);
//        }
//    }
//
//
//
//    /**
//     * 根据展示路径获取文件的输入流
//     *
//     * @param displayPath 展示路径
//     * @return 文件的输入流，如果路径无效或发生错误，则返回 null
//     */
//    @SneakyThrows
//    @Override
//    public InputStream getFileInputStreamFromDisplayPath(String displayPath) {
//        try {
//            String[] bucketAndFile = parseBucketAndFilename(displayPath);
//            if (bucketAndFile == null || bucketAndFile.length != 2) {
//                log.error("展示路径格式不正确：{}", displayPath);
//                return null;
//            }
//
//            String bucketName = bucketAndFile[0];
//            String objectName = bucketAndFile[1];
//
//            InputStream inputStream = client.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
//            if (inputStream != null) {
//                return inputStream;
//            } else {
//                log.error("文件输入流为空：{}", displayPath);
//                return null;
//            }
//        } catch (MinioException e) {
//            log.error("获取文件输入流失败：{}", e.getMessage(), e);
//            throw new RuntimeException("获取文件输入流失败：" + e.getMessage(), e);
//        }
//    }
//
//
//    public  String getFullPath(String bucketName, String filename){
//        String fullPath = endpoint + "/" + bucketName + "/" + filename;
//        return fullPath;
//    }
}
